class Prekladiste{
	
	int premenna = 0;
	boolean zmena = true;
	synchronized void vypisZmenuPremennej(){

		if(zmena){

			System.out.println("zmena = " + zmena);
			zmena = false;
			try {

//				Thread.sleep(2000);    // Vlakno spi (a neuvolni monitor) takze ziadne ine vlakno nemoze pouzit metodu vypisZmenuPremennej lebo je synchonizovana! 
				wait(1000);            // Caka pricom uvolni monitor pre dalsie vlakno aby mohlo vstupit do
				                       // metody vypisZmenuPremennej hoci je ta synchronizovana ! 
				System.out.println("zmena3 = " + zmena);

			}
			catch (InterruptedException e) {

                System.out.println("InterrupetedException");
				
			}
		}
		System.out.println("zmena2 = " + zmena);
//		premenna++;
//		System.out.println(premenna);
	}
}
class Vlakno1 implements Runnable{
	
	Prekladiste pre;
	Thread vl;
	Vlakno1(Prekladiste pre){

       this.pre = pre;
       vl = new Thread(this, "Prve Vlakno");
       vl.start();
		
	}
	public void run(){
		
		pre.vypisZmenuPremennej();
		System.out.println("Vlakno1 ukoncene!");
		
	}
}
class Vlakno2 implements Runnable{

	Prekladiste pre;
	Thread vl;
	Vlakno2(Prekladiste pre){
		
		this.pre = pre;
		vl = new Thread(this, "Druhe Vlakno");
		vl.start();
		
	}
	public void run(){
		
		pre.vypisZmenuPremennej();
		System.out.println("Vlakno2 ukoncene!");
		
	}
}
public class VlaknoTest1 {

	public static void main(String[] args) {
	
		Prekladiste pre = new Prekladiste();
		Vlakno1 v1 = new Vlakno1(pre);
		Vlakno2 v2 = new Vlakno2(pre);
		try{
		
			v1.vl.join();
			v2.vl.join();
			
		    System.out.println("Hlavne vlakno ukoncene!");

		}
		catch(InterruptedException v){
			
			System.out.println("InterruptedException");
			
		}
	}
}
